#include <ani.h>
#include <array>
#include <chrono>
#include <iostream>
#include <thread>

static ani_int Sum([[maybe_unused]] ani_env *env, [[maybe_unused]] ani_object object, ani_int a, ani_int b) {
  std::this_thread::sleep_for(std::chrono::milliseconds(10));
  return a + b;
}

ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) {
  ani_env *env;
  if (ANI_OK != vm->GetEnv(ANI_VERSION_1, &env)) {
    std::cerr << "Unsupported ANI_VERSION_1" << std::endl;
    return ANI_ERROR;
  }

  static const char *className = "main.Calc;";
  ani_class cls;
  if (ANI_OK != env->FindClass(className, &cls)) {
    std::cerr << "Not found '" << className << "'" << std::endl;
    return ANI_ERROR;
  }

  std::array methods = {
      ani_native_function{"sum", "ii:i", reinterpret_cast<void *>(Sum)},
  };

  if (ANI_OK != env->Class_BindNativeMethods(cls, methods.data(), methods.size())) {
    std::cerr << "Cannot bind native methods to '" << className << "'" << std::endl;
    return ANI_ERROR;
  };

  *result = ANI_VERSION_1;
  return ANI_OK;
}
